(for Internet Explorer)
Sub  ModuleAssortClass::ExpandPatch( in_PatchMasterPath as string )
パッチ形式になっているマスター モジュールを完全な形に変換します。
【引数】
in_PatchMasterPath
パッチ形式になっているマスターフォルダーのパス
ソース
→ SyncFilesMenuLib.vbs
パッチ形式のフォルダーの名前は、ベースのターゲットがパッチと同じなら、
"(リビジョン名)-Patch-of-(ベースのリビジョン名)"、そうでなければ、
"(リビジョン名)-Patch-of-(ベースのターゲット名)-(ベースのリビジョン名)" である必要があります。
完全な形が入ったフォルダーの名前は、"(リビジョン名)-Full" になります。
Sub  ModuleAssortClass::MakePatch( in_FullSetMasterPath as string, in_BaseMasterPath as string )
マスター モジュールをパッチ形式に変換します。
【引数】
in_FullSetMasterPath
パッチ形式に変換するマスターフォルダーのパス
パッチのベースとするマスターフォルダーのパス
in_BaseMasterPath
ソース
→ SyncFilesMenuLib.vbs
パッチ形式のフォルダーの名前は、ベースのターゲットがパッチと同じなら、
"(リビジョン名)-Patch-of-(ベースのリビジョン名)" になり、そうでなければ、
"(リビジョン名)-Patch-of-(ベースのターゲット名)-(ベースのリビジョン名)" になります。
複数のフォルダーにある複数のファイルの差分を調べて、Diff ツールやテキスト・エディターを
開くメニューを表示することで、手動でファイルの内容を同じにする作業を支援します。
.AddRootFolder
Function  AddRootFolder( IndexNum, RootFolderPath )
.AddFile
.IsCompareTimeStamp
.IsCompareContents
.Compare
Sub  Compare()
Sub  AddFile( StepPath )
boolean
boolean
Sub  OpenSyncMenu()
→ T_SyncFiles.vbs # main
テスト
→ SyncFilesMenuLib.vbs
.IsSameFolder
Function  IsSameFolder( FolderAIndexNum, FolderBIndexNum )
サンプル・コード
  Set menu = new SyncFilesMenu
  menu.IsCompareTimeStamp = False
  menu.Lead = "Comparing Base, Update1 and Update2"
  menu.AddRootFolder  0, "Folder0"
  menu.AddRootFolder  1, "Folder1"
  menu.AddRootFolder  2, "Folder2"
  menu.RootFolders(0).Label = "Base"
  menu.RootFolders(1).Label = "FolderA"
  menu.RootFolders(2).Label = "FolderB"
  menu.AddFile  "File1.txt"
  menu.AddFile  "File2.txt"
  menu.AddFile  "File3.txt"
  menu.Compare
  menu.OpenSyncMenu
データ構造
SyncFilesRoot<array>
.StepPath
.AbsPath
.Files( Key:StepPath )
SyncFilesFile<dic>
SyncFilesMenu
.RootFolders( Index:Num )
.IsSameBinary[ n ]
string
string
boolean
Comparing Base, Update1 and Update2
 1. NotSame.txt : Base≠FolderA, Base≠FolderB, FolderA≠FolderB
 2. NotSameNo0.txt : Base に存在しません, FolderA≠FolderB
 3. Only0.txt : Base のみに存在します
 4. SameAll.txt : 同じ内容
 99. 戻る
ファイルの番号を入力してください >1

NotSame.txt
 1. Diff ツールを開く
 4. Base のファイルを開く
 5. FolderA のファイルを開く
 6. FolderB のファイルを開く
 99. 戻る
操作の番号を入力してください >
サンプル画面
比較するファイルは、AddFile メソッドを使って1つ1つ指定してください。
(src)
(src)
(src)
(src)
(src)
.IsCallViaFile
boolean
CallViaFile を呼ぶメニュー 80 を追加するかどうか
.RootFolders(i).Label
ラベル。 i は、AddFile の FileNum
ファイルが同じかどうかは、ReadFile の返り値が同じかどうかで判定します。
親フォルダーの指定を、サブ・フォルダーに置き換える
関連
ソース
StepPath を配列にすると、それぞれのフォルダーで異なる
相対パスを設定できます。 その配列の要素数は、AddRootFolder
を呼び出した回数に一致させてください。
.AddFileWithLabel
Sub  AddFileWithLabel( Label, StepPath )
Label 引数が追加された AddFile。
ファイルを選ぶメニューで、ファイル名の右に表示します。
Sub  SyncFilesMenu::SetParentFolderProxyName( IndexNum as integer, Name as string )
親フォルダーの指定を、サブ・フォルダーに置き換えるように設定します。
【引数】
IndexNum
Name
フォルダー番号
サブ・フォルダー名
→ T_SyncFiles.vbs # T_SyncFilesParent
テスト
Set menu = new SyncFilesMenu
menu.IsCompareTimeStamp = False
menu.AddRootFolder  0, "Folder0"
menu.AddRootFolder  1, "Folder1"
menu.SetParentFolderProxyName  1, "_parent"
menu.AddFile  "..\Sample.txt"
サンプル
_parent
上記の場合、Folder0\..\Sample.txt と、Folder1\_parent\Sample.txt を比較します。
(src)
SynchronizeFolder  "C:\FolderA", "C:\FolderB", "C:\Synchronized", "*", Empty
Sub  SynchronizeFolder( FolderA_Path as string, FolderB_Path as string,
    SynchronizedPath as string, Mask as string, in_out_Options as Empty )
2つのフォルダーを同期します。
【引数】
FolderA_Path
FolderB_Path
同期をとるフォルダーのパス
同期をとるもう1つのフォルダーのパス
SynchronizedPath
同期した内容をとっておくフォルダーのパス
サンプル
ソース
Mask
in_out_Options
Empty を指定してください
ファイル名のフィルター(ワイルドカード)
テスト
→ T_SynchronizeFolder.vbs
→ ToolsLib.vbs
両方のフォルダーにある同じ名前のファイルが更新されていたら、手動で更新するように
エラーが表示されます。 hint_path にできたファイルに、手動で同期する必要がある
ファイルのパスが書かれています。 削除されたファイルや、タイムスタンプが過去に
戻ったファイルも手動で同期する必要があります。
<ERROR msg="自動で同期できないファイルがあります" hint_path="C:\hint.txt"/>
>SynchronizeFolder
    A: "C:\FolderA"
    B: "C:\FolderB"
以下のファイルが、両方のフォルダーで変更されました。

"1.txt"
Updated: "C:\FolderA\1.txt"
Updated: "C:\FolderB\1.txt"
例: C:\hint.txt
    If TryStart(e) Then  On Error Resume Next

        SynchronizeFolder  folder_A, folder_B, folder_S, "*.h", Empty

    If TryEnd Then  On Error GoTo 0
    If e.num <> 0 Then
        Set root = LoadXML( e.desc, F_Str )
        hint_path = root.getAttribute( "hint_path" )
        echo  ""
        echo  "自動で同期できないファイルのパスを、テキスト・エディターで表示します。"
        start  GetEditorCmdLine( hint_path )
        e.Raise
    End If
サンプル
エラーがあったら、その内容をエディターで開く
関連
参考
その他
Sub  SetDateLastModified( in_PathAndDate as dictionary of CDate )
タイムスタンプ(ファイルの更新日時)を設定します。
【引数】
in_PathAndDate
キーがタイムスタンプを更新するファイルのパス、アイテムが日付、の辞書
→ vbslib_helper.c
ソース
テスト
→ T_File.c
T_SetDateLastModified
→ vbslib.vbs
in_PathAndDate 引数のアイテムには、
を指定します。
サンプル
SetDateLastModified  Dict(Array( _
    "FileA.txt", CDate( "2008/06/16 12:00:00" ), _
    "FileB.txt", CDate( "2009/09/29 23:59:59" ) ))
関連
指定する日時のタイムゾーンは、ローカルです。
内部で、vbslib_helper.exe を呼び出しているため、ファイルを1つずつ指定すると遅くなります。。
の c.TimeStamp オプション
の Stamp
Sub  touch( Path as string )
タイムスタンプ(ファイルの更新日時)を現在の日時に更新します。
【引数】
Path
タイムスタンプを更新するファイルのパス
テスト
→ T_File.c
ソース
T_touch
→ vbslib.vbs
→ vbslib_helper.c
Path に指定したファイルが存在しないときは、空のファイルを作成します。
Sub  SetDateLastModifiedKS( in_PathAndDate as dictionary of CDate,  in_Option )
テキスト ファイルの中の $Date: 〜 $ にある日時のテキストを更新します。
【引数】
in_PathAndDate
キーが日時を更新するファイルのパス、アイテムが日付、の辞書
指定する日時のタイムゾーンは、ローカルです。
内部で、vbslib_helper.exe を呼び出しています。 ただし、in_Option = False を指定したときは、
呼び出しません。 その分、少し高速に処理しますが、$Date: の値を更新したことにより、
タイムスタンプが現在の日時になります。
in_PathAndDate 引数のアイテムを Empty にすると、現在のタイムスタンプに更新します。
in_PathAndDate 引数のアイテムを
in_Option
Empty, True = 通常、False = 高速、タイムスタンプは現在にする
または W3CDTF 形式の文字列の値にすると、
日時のテキストだけでなく、ファイルのタイムスタンプも更新します。
→ vbslib_helper.c
ソース
テスト
→ T_File.c
T_SetDateLastModified
→ vbslib.vbs
サンプル
SetDateLastModifiedKS  Dict(Array( _
    "FileA.txt",  Empty, _
    "FileB.txt",  "2009-09-29T23:59:59+09:00" )),  Empty
関連
in_PathAndDate 引数のキーを要素数2 の CSV形式(コンマ区切り)にすると、1つ目の要素を
入力ファイルのパス、2つ目の要素を出力ファイルのパスとして処理します。
SetDateLastModifiedKS  Dict(Array( _
    "FileA_Template.txt,  FileA.txt",  Empty )),  Empty
サンプル
FileA.txt ファイルの中の $Date: 〜 $ の中を W3CDTF 形式でファイルのタイムスタンプに
設定します。
FileB.txt ファイルの中の $Date: 〜 $ を下記のように変更します。(タイムゾーンが日本の場合)
// $Date: 2009-09-29T23:59:59+09:00 $
FileA_Template.txt ファイルの中の $Date: 〜 $ の中を W3CDTF 形式でファイルのタイム
スタンプに設定した FileA.txt ファイルを作成または上書きします。
キーワードは、必ず
Function  grep( Parameters as string, OutPath as string ) as array of GrepFound
ファイルの中で、指定したキーワードを含む行を検索します。
【引数】
Parameters
OutPath
オプションと、キーワードと、検索対象フォルダーやワイルドカード(複数可)
Empty または 検索結果の出力先のファイル・パス
返り値
    founds = grep( "-r ""define"" ""..\FolderA\*""", Empty )  '// as array of GrepFound

    '// 返り値のサンプル
    '// UBound( founds ) は、見つかった行数−1
    '// founds(0).Path     = "..\FolderA\grep_target1.txt"
    '// founds(0).LineNum  = 2
    '// founds(0).LineText = "  #define string"

    For Each  found  In  founds
        echo  found.LineText
    Next
Parameters は、Linux の
サンプル
"define" を検索する。 結果は返り値で取得する。
検索対象ファイルは、..\FolderA フォルダーで、サブ・フォルダーも含める。(-r)
grep_target1.txt:2:  define string
grep_target3.txt:2:  define string
grep_target3.txt:4:  define text
sub\grep_target1.txt:2:  define string
grep  "-r -i define *.txt *.ini", "grep_out.txt"
grep_out.txt ファイルのサンプル
"define" を検索する。 結果は、"grep_out.txt" ファイルに出力する。
検索対象ファイルは、拡張子が .txt と .ini で、サブ・フォルダーも含める。(-r)
大文字小文字は区別しない。(-i)
で指定してください。
正規表現 (Linux の egrep形式)
→ 正規表現
→ T_Grep.vbs
テスト
参考
関連
文字列の途中を取り出します。
Parameters に指定した検索対象のパスが、相対パスなら、Path プロパティも
相対パスになります。 そのときの基準フォルダーは、カレント・フォルダーになります。
GrepFound::Path プロパティ
\*
互換性
"|" (バーチカルライン)は、OR の意味になります。
"|" を検索したいときは、"\|" のようにエスケープしてください。
"-" を検索したいときは、"\-" のようにエスケープしてください。
"/"(スラッシュ)は、一般文字であり、エスケープする必要はありません。
+ のメタ文字を使うことができます。
→ 互換性
サンプル
    Set c = g_VBS_Lib
    founds = grep( "-r -l ""define"" ""..\FolderA\*""", c.NotEchoStartCommand )
    For Each  found  In  founds
        echo  found.Path
    Next
ファイル・パスの一覧を得る(-l オプション)
OutPath 引数と返り値
g_VBS_Lib.NotEchoStartCommand を指定すると、見つかった場所について、echo 表示しなく
なります。
単語単位はできません。
-u オプションがなければ、内部で、コマンドプロンプトの findstr コマンドを使用します。
-u オプションがあれば、内部で、VBScript.RegExp を使用します。
ソース
→ vbslib.vbs
キーワードがある行だけ抽出します。
ただし、オプションは、-r と -i と -l と --include のみ指定できます。
  -r : サブフォルダーも検索対象にする
  -i : 大文字と小文字を区別しないで検索する
  -l : キーワードを含むファイルのパスのみ出力する
    -L : キーワードを含まないファイルのパスを出力する
    -c : キーワードを含む行の数を取得するだけのため、返り値の LineNum を求める処理をしない
  --include : 拡張子を指定する
のパラメーターと同じです。
grep コマンド
-u オプション(vbslib オリジナル)を指定しないと、Unicode テキストにはヒットしません。
→ grep コマンド (Linux)
関連
\ 文字は bash を経由したときと同じになります。
つまり、\\ が \ に、\" が " に置き換わった後の文字列が、正規表現に適用されます。
例:
\(
を指定すると、一般文字の(制御文字でない)
\\(
(
\\\\
を指定すると、一般文字の(制御文字でない)
\
または
OutPath 引数に 検索結果の出力先のファイル・パスを指定すると、
例:
結果をファイルに出力する
表示され、返り値は Empty になります。 返り値を GrepFound オブジェクトの配列にしたい
ときは、OutPath 引数に Empty を指定してください。
のように
同様、
を使ったり、OutPath 引数に
の配列、または Empty
-u オプションを指定したときは、内部で
が使われます。
が使えます。 ただし、-u オプションが付いていないと無視されます。
テキストファイルだけを検索対象にする
サンプル
    Set ds = new CurDirStack

    extensions = g_Vers("TextFileExtension").Keys
    extensions = CSVFrom( extensions )
    extensions = Replace( extensions,  ",",  " *." )
    extensions = Left( "*." + extensions,  Len( extensions ) )

    cd  "..\FolderA"
    founds = grep( "-r ""define"" "+ extensions, Empty )  '// as array of GrepFound
    For Each  found  In  founds
        echo  found.Path
    Next
-u オプションがなければ、内部で、コマンドプロンプトの findstr コマンドを使用します。
なぜなら、
で表示しながら検索するため。
Sub  SortGrepFoundArray( Founds as array of GrepFound )
GrepFound クラスのオブジェクトの配列をソートします。
【引数】
Founds
GrepFound クラスのオブジェクトの配列
ソース
→ vbslib.vbs
関連
→ T_Grep.vbs
テスト
ソース
→ vbslib.vbs
T_GrepClass1
T_Grep1 の *_U (grep -u の内部で使っている)
ファイルの中で、指定したキーワードを含む行を検索します。
.IsRecurseSubFolders
サブ・フォルダーも再帰的に検索対象にする。
Execute の TargetPath 引数に PathDictionaryClass
を指定したときは、無視されます
.IsOutFileNameOnly
boolean
boolean
ファイル名のみ出力する
.IsInvertMatch
キーワードにマッチしないものを出力する
boolean
.IsHitCount
LineNum を求める処理をしない
boolean
.IgnoreCase
.Pattern
string
boolean
検索キーワード
(正規表現)
大文字小文字を区別しないかどうか
Function
指定したファイルの中に対して、検索を実行する
\ は、bash を経由しないときと同じになります。
"" を指定すると .IsOutFileNameOnly = True なら、
すべてのファイルを検索結果に含めます。
にあるメンバーと同じものは、同じ名前にしています。
サンプル
Set a_grep = new GrepClass
a.grep.Pattern = "</?xml>"
founds = a_grep.Execute( "folder\*.txt" )
Function  GrepClass::Execute( TargetPath as variant ) as array of GrepFound
ファイルの中で、指定したキーワードを含む行を検索します。
【引数】
TargetPath
検索対象フォルダーやワイルドカード(複数可)、または
返り値
の配列、または Empty
TargetPath 引数は、
の Execute メソッドの引数と異なります。
サンプル
founds = a_grep.Execute( "folder\*.txt" )
founds = a_grep.Execute( Array( "folder_A\*.txt", "folder_B\*.txt" ) )
paths = ArrayFromWildcard( "folder" )
paths.AddRemove  "folder\.svn"
founds = a_grep.Execute( paths )
Function  ToRegExpPattern( NotEscapedString as string ) as string
egrep 仕様・VBScript 仕様の正規表現で使われるメタ文字も検索できるように変換します。
【引数】
NotEscapedString
メタ文字も含む可能性がある検索キーワード
返り値
メタ文字をエスケープした検索キーワード
Assert  ToRegExpPattern( "[0](1)\" ) = "\[0\]\(1\)\\"
サンプル
参考
ソース
関連
→ T_Grep.vbs # [T_GrepKeyword]
テスト
→ vbslib.vbs
→ 正規表現
→ 互換性 (正規表現)
Function  ToOldRegExpPattern( NotEscapedString as string ) as string
grep 仕様の正規表現で使われるメタ文字も検索できるように変換します。
Assert  ToOldRegExpPattern( "[0](1)\" ) = "\[0\](1)\\"
ToRegExpPattern
→ vbslib.vbs
ToOldRegExpPattern
Function  GrepKeyword( NotEscapedString as string ) as string
検索キーワードを grep や egrep のコマンドラインに指定する形式に変換します。
【引数】
NotEscapedString
返り値
検索キーワード
grep や egrep のコマンドラインに指定する形式
Function  EGrepKeyword( NotEscapedString as string ) as string
返り値を grep や egrep のパラメーターに指定するときは、" " で囲んでください。
' ' で囲まないでください。 なぜなら \ がコマンドラインのエスケープ開始文字ではなく
なるからです。
Assert  GrepKeyword( "---\" ) = "\---\\\\"
grep -r "\---" *
(src)
(src)
→ T_Grep.vbs # [T_GrepKeyword]
テスト
サンプル
(src)
Function  GrepExpression( RegularExpression as string ) as string
RegularExpression
正規表現
RegularExpression 引数に指定した \ 文字は bash を経由しないときと同じになります。
例: \\\\ = \ 文字が2つをキーワードとする
RegularExpression 引数の先頭に、- を指定したときにオプションと扱われないように、
先頭に \ が付いたものが返ります。
RegularExpression 引数
Assert  GrepExpression( "---\" ) = "\---\\"
Assert  GrepExpression( "abc[A-Z]\def" ) = "abc[A-Z]\\def"
Assert  GrepKeyword( "abc[0]\def" ) = "abc\\[0\\]\\\\def"
関連